package pe.gob.mininter.dirandro.vaadin.panel.configuracion;

import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import pe.gob.mininter.dirandro.exception.ValidacionException;
import pe.gob.mininter.dirandro.model.Lista;
import pe.gob.mininter.dirandro.model.Opcion;
import pe.gob.mininter.dirandro.model.Parametro;
import pe.gob.mininter.dirandro.model.Valor;
import pe.gob.mininter.dirandro.service.ListaService;
import pe.gob.mininter.dirandro.service.ParametroService;
import pe.gob.mininter.dirandro.service.ValorService;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.vaadin.util.DirandroComponent;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.event.FieldEvents.TextChangeEvent;
import com.vaadin.event.FieldEvents.TextChangeListener;
import com.vaadin.ui.AbstractTextField.TextChangeEventMode;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

public class PanelConfigListaValores extends DirandroComponent implements TextChangeListener, ClickListener{
	
	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
		
	@AutoGenerated
	private VerticalLayout mainLayout;

	@AutoGenerated
	private VerticalLayout pnlAdminListaValor;

	@AutoGenerated
	private HorizontalLayout pnlValorContenido;

	@AutoGenerated
	private VerticalLayout pnlGrabarValor;

	@AutoGenerated
	private HorizontalLayout pnlValorFila5;

	@AutoGenerated
	private Button btnEliminarValor;

	@AutoGenerated
	private Button btnGrabarValor;

	@AutoGenerated
	private HorizontalLayout pnlValorFila4;

	@AutoGenerated
	private TextField txtDescripcionValor;

	@AutoGenerated
	private HorizontalLayout pnlValorFila3;

	@AutoGenerated
	private TextField txtOrdenValor;

	@AutoGenerated
	private TextField txtNombreValor;

	@AutoGenerated
	private HorizontalLayout pnlValorFila2;

	@AutoGenerated
	private ComboBox cboEstadoValor;

	@AutoGenerated
	private TextField txtCodigoValor;

	@AutoGenerated
	private Label lblIdValor;

	@AutoGenerated
	private HorizontalLayout pnlValorFila1;

	@AutoGenerated
	private ComboBox cmbLista;

	@AutoGenerated
	private Label lblGrabarValor;

	@AutoGenerated
	private VerticalLayout pnlValores;

	@AutoGenerated
	private Table tblValores;

	@AutoGenerated
	private HorizontalLayout pnlFiltroValores;

	@AutoGenerated
	private TextField txtFiltroEstadoValor;

	@AutoGenerated
	private TextField txtFiltroNombreValor;

	@AutoGenerated
	private TextField txtFiltroCodigoValor;

	@AutoGenerated
	private Label lblValores;

	@AutoGenerated
	private HorizontalLayout pnlListaContenido;

	@AutoGenerated
	private VerticalLayout pnlGrabarLista;

	@AutoGenerated
	private HorizontalLayout pnlListaFila4;

	@AutoGenerated
	private Button btnEliminarLista;

	@AutoGenerated
	private Button btnGrabarLista;

	@AutoGenerated
	private VerticalLayout pnlListaFila3;

	@AutoGenerated
	private TextField txtDescirpcionLista;

	@AutoGenerated
	private VerticalLayout pnlListaFila2;

	@AutoGenerated
	private TextField txtNombreLista;

	@AutoGenerated
	private HorizontalLayout pnlListaFila1;

	@AutoGenerated
	private ComboBox cbmEstadoLista;

	@AutoGenerated
	private TextField txtCodigoLista;

	@AutoGenerated
	private Label lblIdLista;

	@AutoGenerated
	private Label lblGrabarLista;

	@AutoGenerated
	private VerticalLayout pnlListas;

	@AutoGenerated
	private Table tblListas;

	@AutoGenerated
	private HorizontalLayout pnlFiltrosListas;

	@AutoGenerated
	private TextField txtFiltroEstadoLista;

	@AutoGenerated
	private TextField txtFiltroNombreLista;

	@AutoGenerated
	private TextField txtFiltroCodigoLista;

	@AutoGenerated
	private TextField txtFiltroIdLista;

	@AutoGenerated
	private Label lblFiltroBusqueda;

	protected static final Log logger = LogFactory.getLog(PanelConfigListaValores.class);
	private static final long serialVersionUID = -5759281628746296754L;	

	private ListaService listaService;
	private ValorService valorService;
	private ParametroService parametroService;
	
	private List<Lista> lstListas;
	private List<Valor> lstValores;
	private boolean flagNuevoLista;
	private boolean flagNuevoValor;
	private String[] estados;

	public PanelConfigListaValores(List<Opcion> acciones, String height) {
		super(acciones, height);
		listaService = Injector.obtenerServicio(ListaService.class);
		valorService = Injector.obtenerServicio(ValorService.class);
		parametroService = Injector.obtenerServicio(ParametroService.class);
		
		buildMainLayout();
		setCompositionRoot(mainLayout);		
		postConstruct();
	}
	
	public void postConstruct() {
		
		lblIdLista.setValue("");
		lblIdValor.setValue("");
		txtDescirpcionLista.setNullRepresentation("");
		txtDescripcionValor.setNullRepresentation("");
		txtOrdenValor.setNullRepresentation("");
		txtOrdenValor.addListener(new TextChangeListener() {
			
			/**
			 * 
			 */
			private static final long serialVersionUID = -290756895950492262L;

			@Override
			public void textChange(TextChangeEvent event) {
				if(StringUtils.isNumeric(event.getText())){
					txtOrdenValor.setValue(event.getText());
				}else{
					txtOrdenValor.setValue(txtOrdenValor.getValue());
				}
			}
		});
		txtOrdenValor.setTextChangeEventMode(TextChangeEventMode.EAGER);
		pnlValorContenido.setVisible(false);
		lstListas = listaService.buscar(null);
		cargarListas(lstListas, true);
		
		habilitarEdicion("lista",false);
		
		tblListas.setSelectable(true);
		tblListas.setImmediate(true);
		tblListas.setNullSelectionAllowed(true);
		tblListas.setNullSelectionItemId(null);
		
		tblListas.addListener(new ValueChangeListener() {
			
			private static final long serialVersionUID = 2869400278578730206L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				boolean esModoNuevo = tblListas.getValue() == null;
				if(esModoNuevo){
					tblListas.setValue(null);
					habilitarEdicion("lista",!esModoNuevo);
					lblIdLista.setValue("");
					limpiar("lista");
					pnlValorContenido.setVisible(false);
				}
				else{
					Item item = tblListas.getItem(tblListas.getValue());
					lblIdLista.setValue(item.getItemProperty("id").getValue());
					txtCodigoLista.setValue(item.getItemProperty("codigo").getValue());
					txtNombreLista.setValue(item.getItemProperty("nombre").getValue());
					txtDescirpcionLista.setValue(item.getItemProperty("descripcion").getValue());
					cbmEstadoLista.select(item.getItemProperty("estado").getValue());					
					habilitarEdicion("lista",!esModoNuevo);
									
					for (Lista lista : lstListas) {
						if(lista.getId().equals((Long)item.getItemProperty("id").getValue())){
							cmbLista.select(lista);
							lstValores = valorService.buscar(new Valor(lista));
							break;
						}
					}
					
					cargarValores(lstValores, true);
					habilitarEdicion("valor",false);
					pnlValorContenido.setVisible(true);
				}
			}
		});
		
		tblValores.setSelectable(true);
		tblValores.setImmediate(true);
		tblValores.setNullSelectionAllowed(true);
		tblValores.setNullSelectionItemId(null);
		tblValores.addListener(new ValueChangeListener() {
			
			private static final long serialVersionUID = 8766174414524651740L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				boolean esModoNuevo = tblValores.getValue() == null;
				if(esModoNuevo){
					tblValores.setValue(null);
					habilitarEdicion("valor",!esModoNuevo);
					lblIdValor.setValue("");
					limpiar("valor");
				}
				else{
					Item item = tblValores.getItem(tblValores.getValue());
					lblIdValor.setValue(item.getItemProperty("id").getValue());
					lblIdValor.setVisible(false);
					txtCodigoValor.setValue(item.getItemProperty("codigo").getValue());
					txtNombreValor.setValue(item.getItemProperty("nombre").getValue());
					txtOrdenValor.setValue(item.getItemProperty("orden").getValue());
					txtDescripcionValor.setValue(item.getItemProperty("descripcion").getValue());
					cboEstadoValor.select(item.getItemProperty("estado").getValue());					
					
					for (Lista lista : lstListas) {
						if (lista.getId().equals((Long) item.getItemProperty("lista.id").getValue()))
							cmbLista.select(lista);
					}
					habilitarEdicion("valor",!esModoNuevo);
				}
			}
		});
		
		Parametro parametro = parametroService.obtener(Constante.PARAMETRO.ESTADO_LOV);
		
		estados = parametro.getValor().split(",");
		BeanItemContainer<String> bicEstados = new BeanItemContainer<String>(String.class, Arrays.asList(estados));
		
		BeanItemContainer<Lista> bicListas = new BeanItemContainer<Lista>(Lista.class,  lstListas);
		
		cbmEstadoLista.setInputPrompt("Estado");
		cbmEstadoLista.setContainerDataSource(bicEstados);

		cboEstadoValor.setInputPrompt("Estado");
		cboEstadoValor.setContainerDataSource(bicEstados);
		
		cmbLista.setInputPrompt("Lista");
		cmbLista.setContainerDataSource(bicListas);
		cmbLista.setItemCaptionPropertyId("nombre");
		
		txtFiltroIdLista.setImmediate(true);
		txtFiltroCodigoLista.setImmediate(true);
		txtFiltroNombreLista.setImmediate(true);
		txtFiltroEstadoLista.setImmediate(true);
		
		txtFiltroIdLista.addListener((TextChangeListener)this);
		txtFiltroCodigoLista.addListener((TextChangeListener)this);
		txtFiltroNombreLista.addListener((TextChangeListener)this);
		txtFiltroEstadoLista.addListener((TextChangeListener)this);

		txtFiltroCodigoValor.setImmediate(true);
		txtFiltroNombreValor.setImmediate(true);
		txtFiltroEstadoValor.setImmediate(true);
		
		txtFiltroCodigoValor.addListener((TextChangeListener)this);
		txtFiltroNombreValor.addListener((TextChangeListener)this);
		txtFiltroEstadoValor.addListener((TextChangeListener)this);
		
		btnGrabarLista.addListener((ClickListener)this);
		btnEliminarLista.addListener((ClickListener)this);
		btnGrabarValor.addListener((ClickListener)this);
		btnEliminarValor.addListener((ClickListener)this);
		
	}

	private void habilitarEdicion(String nombre, boolean flag) {
		if (nombre.equals("lista")) {
			flagNuevoLista = !flag;
			btnEliminarLista.setVisible(flag);
			if (flag) {
				btnGrabarLista.setCaption("Actualizar");
			} else {
				btnGrabarLista.setCaption("Crear");
			}
		} else if (nombre.equals("valor")) {
			flagNuevoValor = !flag;
			btnEliminarValor.setVisible(flag);
			if (flag) {
				btnGrabarValor.setCaption("Actualizar");
			} else {
				btnGrabarValor.setCaption("Crear");
			}
		}
	}
	
	private void limpiar(String nombre) {
		if (nombre.equals("lista")) {
			txtCodigoLista.setValue("");
			cbmEstadoLista.setValue(null);
			txtNombreLista.setValue("");
			txtDescirpcionLista.setValue("");
		} else if (nombre.equals("valor")) {
			txtCodigoValor.setValue("");
			cboEstadoValor.setValue(null);
			txtNombreValor.setValue("");
			txtDescripcionValor.setValue("");
			txtOrdenValor.setValue("");
			Item item = tblListas.getItem(tblListas.getValue());
			Lista lista = new Lista();
			lista.setId((Long) item.getItemProperty("id").getValue());
			cmbLista.select(lista);
		}
	}
	
	private void cargarListas(List<Lista> listas, boolean flagLimpiar){
		IndexedContainer container = new IndexedContainer();
		
		container.addContainerProperty("id", Long.class,  null);
		container.addContainerProperty("codigo", String.class, null);
		container.addContainerProperty("nombre", String.class, null);			
		container.addContainerProperty("descripcion", String.class, null);
		container.addContainerProperty("estado", String.class, null);
		
		int con=1;
		for (Lista lista: listas) {
			Item item = container.addItem(con++);
            item.getItemProperty("id").setValue(lista.getId());
            item.getItemProperty("codigo").setValue(lista.getCodigo());
            item.getItemProperty("nombre").setValue(lista.getNombre());
            item.getItemProperty("descripcion").setValue(lista.getDescripcion());
            item.getItemProperty("estado").setValue(lista.getEstado());
		}
		
		tblListas.setContainerDataSource(container);
		tblListas.setVisibleColumns(new Object[]{"id", "codigo", "nombre", "estado"});
		tblListas.setColumnWidth("id", 16);
		tblListas.setColumnWidth("codigo", 147);
		tblListas.setColumnWidth("nombre", 218);
		tblListas.setColumnWidth("estado", 45);
		tblListas.setColumnHeader("id", "Id");
		tblListas.setColumnHeader("codigo", "Codigo");
		tblListas.setColumnHeader("nombre", "Nombre");
		tblListas.setColumnHeader("estado", "Estado");

		if (flagLimpiar) {
			txtFiltroIdLista.setValue("");
			txtFiltroCodigoLista.setValue("");
			txtFiltroNombreLista.setValue("");
			txtFiltroEstadoLista.setValue("");
		}

	}
	
	private void cargarValores(List<Valor> valores, boolean flagLimpiar){
		IndexedContainer container = new IndexedContainer();
		
		container.addContainerProperty("id", Long.class,  null);
		container.addContainerProperty("codigo", String.class, null);
		container.addContainerProperty("nombre", String.class, null);	
		container.addContainerProperty("orden", Integer.class, null);	
		container.addContainerProperty("descripcion", String.class, null);
		container.addContainerProperty("estado", String.class, null);
		container.addContainerProperty("lista.codigo", String.class, null);
		container.addContainerProperty("lista.id", Long.class, null);
		
		int con=1;
		for (Valor valor: valores) {
			Item item = container.addItem(con++);
            item.getItemProperty("id").setValue(valor.getId());
            item.getItemProperty("codigo").setValue(valor.getCodigo());
            item.getItemProperty("nombre").setValue(valor.getNombre());
            item.getItemProperty("orden").setValue(valor.getOrden());
            item.getItemProperty("descripcion").setValue(valor.getDescripcion());
            item.getItemProperty("estado").setValue(valor.getEstado());
            item.getItemProperty("lista.codigo").setValue(valor.getLista().getCodigo());
            item.getItemProperty("lista.id").setValue(valor.getLista().getId());
		}
		
		tblValores.setContainerDataSource(container);
		tblValores.setVisibleColumns(new Object[]{"codigo", "nombre", "orden", "estado"});
		tblValores.setColumnWidth("id", 16);
		tblValores.setColumnWidth("codigo", 147);
		tblValores.setColumnWidth("nombre", 167);
		tblValores.setColumnWidth("orden", 38);
		tblValores.setColumnWidth("estado", 45);		
		tblValores.setColumnHeader("id", "Id");
		tblValores.setColumnHeader("codigo", "Codigo");
		tblValores.setColumnHeader("nombre", "Nombre");
		tblValores.setColumnHeader("orden", "Orden");
		tblValores.setColumnHeader("estado", "Estado");
		
		if(flagLimpiar)
		{	
			txtFiltroCodigoValor.setValue("");
			txtFiltroNombreValor.setValue("");
			txtFiltroEstadoValor.setValue("");
		}
		
	}

	@Override
	public void textChange(TextChangeEvent event) {
		Lista lista = null;
		Valor valor = null;
		if(event.getSource().equals(txtFiltroIdLista))
		{
			lista = new Lista();
			if(StringUtils.isNotBlank(event.getText()))
			{
				lista.setId(Long.parseLong(event.getText()));
			}
			if(StringUtils.isNotBlank(txtFiltroCodigoLista.getValue().toString()))
			{
				lista.setCodigo(txtFiltroCodigoLista.getValue().toString());
			}
			if(StringUtils.isNotBlank(txtFiltroNombreLista.getValue().toString()))
			{
				lista.setNombre(txtFiltroNombreLista.getValue().toString());
			}
			if(StringUtils.isNotBlank(txtFiltroEstadoLista.getValue().toString()))
			{
				lista.setEstado(txtFiltroEstadoLista.getValue().toString());
			}
		}
		if(event.getSource().equals(txtFiltroCodigoLista))
		{
			lista = new Lista();
			if(StringUtils.isNotBlank(txtFiltroIdLista.getValue().toString()))
			{
				lista.setId(Long.parseLong(txtFiltroIdLista.getValue().toString()));
			}
			if(StringUtils.isNotBlank(event.getText()))
			{
				lista.setCodigo(event.getText());
			}
			if(StringUtils.isNotBlank(txtFiltroNombreLista.getValue().toString()))
			{
				lista.setNombre(txtFiltroNombreLista.getValue().toString());
			}
			if(StringUtils.isNotBlank(txtFiltroEstadoLista.getValue().toString()))
			{
				lista.setEstado(txtFiltroEstadoLista.getValue().toString());
			}
		}
		if(event.getSource().equals(txtFiltroNombreLista))
		{
			lista = new Lista();
			if(StringUtils.isNotBlank(txtFiltroIdLista.getValue().toString()))
			{
				lista.setId(Long.parseLong(txtFiltroIdLista.getValue().toString()));
			}
			if(StringUtils.isNotBlank(txtFiltroCodigoLista.getValue().toString()))
			{
				lista.setCodigo(txtFiltroCodigoLista.getValue().toString());
			}
			if(StringUtils.isNotBlank(event.getText()))
			{
				lista.setNombre(event.getText());
			}
			if(StringUtils.isNotBlank(txtFiltroEstadoLista.getValue().toString()))
			{
				lista.setEstado(txtFiltroEstadoLista.getValue().toString());
			}
		}
		if(event.getSource().equals(txtFiltroEstadoLista))
		{
			lista = new Lista();
			if(StringUtils.isNotBlank(txtFiltroIdLista.getValue().toString()))
			{
				lista.setId(Long.parseLong(txtFiltroIdLista.getValue().toString()));
			}
			if(StringUtils.isNotBlank(txtFiltroCodigoLista.getValue().toString()))
			{
				lista.setCodigo(txtFiltroCodigoLista.getValue().toString());
			}
			if(StringUtils.isNotBlank(txtFiltroNombreLista.getValue().toString()))
			{
				lista.setNombre(txtFiltroNombreLista.getValue().toString());
			}
			if(StringUtils.isNotBlank(event.getText()))
			{
				lista.setEstado(txtFiltroEstadoLista.getValue().toString());
			}
		}
	
		if(event.getSource().equals(txtFiltroCodigoValor))
		{
			valor = new Valor();
			if(StringUtils.isNotBlank(event.getText()))
			{
				valor.setCodigo(event.getText());
			}
			if(StringUtils.isNotBlank(txtFiltroNombreValor.getValue().toString()))
			{
				valor.setNombre(txtFiltroNombreValor.getValue().toString());
			}
			if(StringUtils.isNotBlank(txtFiltroEstadoValor.getValue().toString()))
			{
				valor.setEstado(txtFiltroEstadoValor.getValue().toString());
			}
		}
		if(event.getSource().equals(txtFiltroNombreValor))
		{
			valor = new Valor();
			if(StringUtils.isNotBlank(txtFiltroCodigoValor.getValue().toString()))
			{
				valor.setCodigo(txtFiltroCodigoValor.getValue().toString());
			}
			if(StringUtils.isNotBlank(event.getText()))
			{
				valor.setNombre(event.getText());
			}
			if(StringUtils.isNotBlank(txtFiltroEstadoValor.getValue().toString()))
			{
				valor.setEstado(txtFiltroEstadoValor.getValue().toString());
			}
		}
		if(event.getSource().equals(txtFiltroEstadoValor))
		{
			valor = new Valor();
			if(StringUtils.isNotBlank(txtFiltroCodigoValor.getValue().toString()))
			{
				valor.setCodigo(txtFiltroCodigoValor.getValue().toString());
			}
			if(StringUtils.isNotBlank(txtFiltroNombreValor.getValue().toString()))
			{
				valor.setNombre(txtFiltroNombreValor.getValue().toString());
			}
			if(StringUtils.isNotBlank(event.getText()))
			{
				valor.setEstado(event.getText());
			}
		}
		if(lista!=null){
			List<Lista> listas = listaService.buscar(lista);
			cargarListas(listas, false);
			limpiar("lista");
			habilitarEdicion("lista",false);
		}
		if(valor!=null){
			Item item = tblListas.getItem(tblListas.getValue());
			lista = new Lista();
			lista.setId((Long)item.getItemProperty("id").getValue());
			valor.setLista(lista);
			List<Valor> valores = valorService.buscar(valor);
			cargarValores(valores, false);
			limpiar("valor");
			habilitarEdicion("valor",false);
		}
	}

	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnGrabarLista)){
			Lista lista = new Lista();
			lista.setCodigo((String)txtCodigoLista.getValue());
			lista.setNombre((String)txtNombreLista.getValue());
			lista.setDescripcion((String)txtDescirpcionLista.getValue());
			lista.setEstado((String)cbmEstadoLista.getValue());

			if (flagNuevoLista) {
				listaService.crear(lista);
			}
			else{
				lista.setId(Long.parseLong(lblIdLista.getValue().toString()));
				listaService.actualizar(lista);
			}
			refrescar("lista");
		}
		if(event.getButton().equals(btnEliminarLista)){
			try {
				listaService.eliminarXId(Long.parseLong(lblIdLista.getValue().toString()));
			} catch (Exception e) {
				if (e.getMessage().substring(0, 9).equals(Constante.EXCEPTION.FOREING_KEY)) {
					throw new ValidacionException(Constante.CODIGO_MENSAJE.VALIDAR_DEPENDENCIA, new Object[] { txtCodigoLista.getValue() });
				}
			}
			
			refrescar("lista");
		}
		if(event.getButton().equals(btnGrabarValor)){
			Valor valor = new Valor();
			valor.setCodigo(txtCodigoValor.getValue().toString());
			valor.setNombre(txtNombreValor.getValue().toString());
			valor.setDescripcion((String)txtDescripcionValor.getValue());
			if(txtOrdenValor.getValue()!=null && !txtOrdenValor.getValue().equals("")){
			valor.setOrden(Integer.parseInt(txtOrdenValor.getValue().toString()));
			}
			valor.setEstado((String)cboEstadoValor.getValue());
			Lista lista1 = (Lista)cmbLista.getValue();
			valor.setLista(lista1);

			if(flagNuevoValor)
			{
				valorService.crear(valor);
			}
			else
			{
				valor.setId(Long.parseLong(lblIdValor.getValue().toString()));
				valorService.actualizar(valor);
			}
			refrescar("valor");
		}
		if(event.getButton().equals(btnEliminarValor))
		{
			valorService.eliminarXId(Long.parseLong(lblIdValor.getValue().toString()));
			refrescar("valor");
		}
	}
	
	private void refrescar(String nombre){
		habilitarEdicion(nombre,false);
		limpiar(nombre);
		if(nombre.equals("lista")){
			List<Lista> listas = listaService.buscar(null);
			cargarListas(listas, true);
			BeanItemContainer<Lista> bicListas = new BeanItemContainer<Lista>(Lista.class,  listas);
			cmbLista.setInputPrompt("Lista");
			cmbLista.setContainerDataSource(bicListas);
			cmbLista.setItemCaptionPropertyId("nombre");
		}else if(nombre.equals("valor")){
			Item item = tblListas.getItem(tblListas.getValue());
			Lista lista = new Lista();
			lista.setId((Long)item.getItemProperty("id").getValue());
			Valor valor = new Valor();
			valor.setLista(lista);
			List<Valor> valores = valorService.buscar(valor);
			cargarValores(valores, true);
		}
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(true);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// pnlAdminListaValor
		pnlAdminListaValor = buildPnlAdminListaValor();
		mainLayout.addComponent(pnlAdminListaValor);
		mainLayout.setComponentAlignment(pnlAdminListaValor, new Alignment(20));
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildPnlAdminListaValor() {
		// common part: create layout
		pnlAdminListaValor = new VerticalLayout();
		pnlAdminListaValor.setStyleName("whiteBackGround");
		pnlAdminListaValor.setImmediate(false);
		pnlAdminListaValor.setWidth("-1px");
		pnlAdminListaValor.setHeight("-1px");
		pnlAdminListaValor.setMargin(true);
		pnlAdminListaValor.setSpacing(true);
		
		// pnlListaContenido
		pnlListaContenido = buildPnlListaContenido();
		pnlAdminListaValor.addComponent(pnlListaContenido);
		
		// pnlValorContenido
		pnlValorContenido = buildPnlValorContenido();
		pnlAdminListaValor.addComponent(pnlValorContenido);
		
		return pnlAdminListaValor;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlListaContenido() {
		// common part: create layout
		pnlListaContenido = new HorizontalLayout();
		pnlListaContenido.setStyleName("whiteBackGround");
		pnlListaContenido.setImmediate(false);
		pnlListaContenido.setWidth("-1px");
		pnlListaContenido.setHeight("-1px");
		pnlListaContenido.setMargin(true);
		
		// pnlListas
		pnlListas = buildPnlListas();
		pnlListaContenido.addComponent(pnlListas);
		
		// pnlGrabarLista
		pnlGrabarLista = buildPnlGrabarLista();
		pnlListaContenido.addComponent(pnlGrabarLista);
		
		return pnlListaContenido;
	}

	@AutoGenerated
	private VerticalLayout buildPnlListas() {
		// common part: create layout
		pnlListas = new VerticalLayout();
		pnlListas.setImmediate(false);
		pnlListas.setWidth("520px");
		pnlListas.setHeight("-1px");
		pnlListas.setMargin(false);
		
		// lblFiltroBusqueda
		lblFiltroBusqueda = new Label();
		lblFiltroBusqueda.setStyleName("h2");
		lblFiltroBusqueda.setImmediate(false);
		lblFiltroBusqueda.setWidth("100.0%");
		lblFiltroBusqueda.setHeight("-1px");
		lblFiltroBusqueda.setValue("Filtro de Busqueda de Listas");
		pnlListas.addComponent(lblFiltroBusqueda);
		
		// pnlFiltrosListas
		pnlFiltrosListas = buildPnlFiltrosListas();
		pnlListas.addComponent(pnlFiltrosListas);
		
		// tblListas
		tblListas = new Table();
		tblListas.setImmediate(false);
		tblListas.setWidth("500px");
		tblListas.setHeight("210px");
		pnlListas.addComponent(tblListas);
		
		return pnlListas;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlFiltrosListas() {
		// common part: create layout
		pnlFiltrosListas = new HorizontalLayout();
		pnlFiltrosListas.setImmediate(false);
		pnlFiltrosListas.setWidth("-1px");
		pnlFiltrosListas.setHeight("-1px");
		pnlFiltrosListas.setMargin(false);
		
		// txtFiltroIdLista
		txtFiltroIdLista = new TextField();
		txtFiltroIdLista.setImmediate(false);
		txtFiltroIdLista.setDescription("id lista");
		txtFiltroIdLista.setWidth("30px");
		txtFiltroIdLista.setHeight("-1px");
		txtFiltroIdLista.setInputPrompt("id");
		pnlFiltrosListas.addComponent(txtFiltroIdLista);
		
		// txtFiltroCodigoLista
		txtFiltroCodigoLista = new TextField();
		txtFiltroCodigoLista.setImmediate(false);
		txtFiltroCodigoLista.setWidth("160px");
		txtFiltroCodigoLista.setHeight("-1px");
		txtFiltroCodigoLista.setInputPrompt("Código");
		pnlFiltrosListas.addComponent(txtFiltroCodigoLista);
		
		// txtFiltroNombreLista
		txtFiltroNombreLista = new TextField();
		txtFiltroNombreLista.setImmediate(false);
		txtFiltroNombreLista.setWidth("230px");
		txtFiltroNombreLista.setHeight("-1px");
		txtFiltroNombreLista.setInputPrompt("Nombre");
		pnlFiltrosListas.addComponent(txtFiltroNombreLista);
		
		// txtFiltroEstadoLista
		txtFiltroEstadoLista = new TextField();
		txtFiltroEstadoLista.setImmediate(false);
		txtFiltroEstadoLista.setWidth("70px");
		txtFiltroEstadoLista.setHeight("-1px");
		txtFiltroEstadoLista.setInputPrompt("Estado");
		pnlFiltrosListas.addComponent(txtFiltroEstadoLista);
		
		return pnlFiltrosListas;
	}

	@AutoGenerated
	private VerticalLayout buildPnlGrabarLista() {
		// common part: create layout
		pnlGrabarLista = new VerticalLayout();
		pnlGrabarLista.setImmediate(false);
		pnlGrabarLista.setWidth("-1px");
		pnlGrabarLista.setHeight("-1px");
		pnlGrabarLista.setMargin(false);
		
		// lblGrabarLista
		lblGrabarLista = new Label();
		lblGrabarLista.setStyleName("h2");
		lblGrabarLista.setImmediate(false);
		lblGrabarLista.setWidth("100.0%");
		lblGrabarLista.setHeight("-1px");
		lblGrabarLista.setValue("Administración de Lista");
		pnlGrabarLista.addComponent(lblGrabarLista);
		
		// pnlListaFila1
		pnlListaFila1 = buildPnlListaFila1();
		pnlGrabarLista.addComponent(pnlListaFila1);
		
		// pnlListaFila2
		pnlListaFila2 = buildPnlListaFila2();
		pnlGrabarLista.addComponent(pnlListaFila2);
		
		// pnlListaFila3
		pnlListaFila3 = buildPnlListaFila3();
		pnlGrabarLista.addComponent(pnlListaFila3);
		
		// pnlListaFila4
		pnlListaFila4 = buildPnlListaFila4();
		pnlGrabarLista.addComponent(pnlListaFila4);
		
		return pnlGrabarLista;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlListaFila1() {
		// common part: create layout
		pnlListaFila1 = new HorizontalLayout();
		pnlListaFila1.setImmediate(false);
		pnlListaFila1.setWidth("-1px");
		pnlListaFila1.setHeight("-1px");
		pnlListaFila1.setMargin(false);
		pnlListaFila1.setSpacing(true);
		
		// lblIdLista
		lblIdLista = new Label();
		lblIdLista.setImmediate(false);
		lblIdLista.setWidth("20px");
		lblIdLista.setHeight("-1px");
		lblIdLista.setValue("Label");
		pnlListaFila1.addComponent(lblIdLista);
		pnlListaFila1.setComponentAlignment(lblIdLista, new Alignment(9));
		
		// txtCodigoLista
		txtCodigoLista = new TextField();
		txtCodigoLista.setCaption("Código");
		txtCodigoLista.setImmediate(false);
		txtCodigoLista.setWidth("120px");
		txtCodigoLista.setHeight("-1px");
		txtCodigoLista.setRequired(true);
		txtCodigoLista.setInputPrompt("Código");
		pnlListaFila1.addComponent(txtCodigoLista);
		
		// cbmEstadoLista
		cbmEstadoLista = new ComboBox();
		cbmEstadoLista.setCaption("Estado");
		cbmEstadoLista.setImmediate(false);
		cbmEstadoLista.setWidth("145px");
		cbmEstadoLista.setHeight("-1px");
		cbmEstadoLista.setRequired(true);
		pnlListaFila1.addComponent(cbmEstadoLista);
		
		return pnlListaFila1;
	}

	@AutoGenerated
	private VerticalLayout buildPnlListaFila2() {
		// common part: create layout
		pnlListaFila2 = new VerticalLayout();
		pnlListaFila2.setCaption(" ");
		pnlListaFila2.setImmediate(false);
		pnlListaFila2.setWidth("-1px");
		pnlListaFila2.setHeight("-1px");
		pnlListaFila2.setMargin(false);
		
		// txtNombreLista
		txtNombreLista = new TextField();
		txtNombreLista.setCaption("Nombre");
		txtNombreLista.setImmediate(false);
		txtNombreLista.setWidth("320px");
		txtNombreLista.setHeight("-1px");
		txtNombreLista.setRequired(true);
		txtNombreLista.setInputPrompt("Nombre de la Lista");
		pnlListaFila2.addComponent(txtNombreLista);
		
		return pnlListaFila2;
	}

	@AutoGenerated
	private VerticalLayout buildPnlListaFila3() {
		// common part: create layout
		pnlListaFila3 = new VerticalLayout();
		pnlListaFila3.setCaption(" ");
		pnlListaFila3.setImmediate(false);
		pnlListaFila3.setWidth("-1px");
		pnlListaFila3.setHeight("-1px");
		pnlListaFila3.setMargin(false);
		
		// txtDescirpcionLista
		txtDescirpcionLista = new TextField();
		txtDescirpcionLista.setCaption("Descripción");
		txtDescirpcionLista.setImmediate(false);
		txtDescirpcionLista.setWidth("320px");
		txtDescirpcionLista.setHeight("-1px");
		txtDescirpcionLista.setRequired(true);
		txtDescirpcionLista.setInputPrompt("Descripción breve de la lista");
		pnlListaFila3.addComponent(txtDescirpcionLista);
		
		return pnlListaFila3;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlListaFila4() {
		// common part: create layout
		pnlListaFila4 = new HorizontalLayout();
		pnlListaFila4.setCaption(" ");
		pnlListaFila4.setImmediate(false);
		pnlListaFila4.setWidth("320px");
		pnlListaFila4.setHeight("-1px");
		pnlListaFila4.setMargin(false);
		
		// btnGrabarLista
		btnGrabarLista = new Button();
		btnGrabarLista.setCaption("Actualizar");
		btnGrabarLista.setImmediate(true);
		btnGrabarLista.setWidth("-1px");
		btnGrabarLista.setHeight("-1px");
		pnlListaFila4.addComponent(btnGrabarLista);
		pnlListaFila4.setComponentAlignment(btnGrabarLista, new Alignment(20));
		
		// btnEliminarLista
		btnEliminarLista = new Button();
		btnEliminarLista.setCaption("Eliminar");
		btnEliminarLista.setImmediate(true);
		btnEliminarLista.setWidth("-1px");
		btnEliminarLista.setHeight("-1px");
		pnlListaFila4.addComponent(btnEliminarLista);
		pnlListaFila4
				.setComponentAlignment(btnEliminarLista, new Alignment(20));
		
		return pnlListaFila4;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlValorContenido() {
		// common part: create layout
		pnlValorContenido = new HorizontalLayout();
		pnlValorContenido.setImmediate(false);
		pnlValorContenido.setWidth("-1px");
		pnlValorContenido.setHeight("-1px");
		pnlValorContenido.setMargin(true);
		
		// pnlValores
		pnlValores = buildPnlValores();
		pnlValorContenido.addComponent(pnlValores);
		
		// pnlGrabarValor
		pnlGrabarValor = buildPnlGrabarValor();
		pnlValorContenido.addComponent(pnlGrabarValor);
		
		return pnlValorContenido;
	}

	@AutoGenerated
	private VerticalLayout buildPnlValores() {
		// common part: create layout
		pnlValores = new VerticalLayout();
		pnlValores.setImmediate(false);
		pnlValores.setWidth("520px");
		pnlValores.setHeight("-1px");
		pnlValores.setMargin(false);
		
		// lblValores
		lblValores = new Label();
		lblValores.setImmediate(false);
		lblValores.setWidth("100.0%");
		lblValores.setHeight("-1px");
		lblValores.setValue("Filtro de Busqueda de Valores");
		pnlValores.addComponent(lblValores);
		
		// pnlFiltroValores
		pnlFiltroValores = buildPnlFiltroValores();
		pnlValores.addComponent(pnlFiltroValores);
		
		// tblValores
		tblValores = new Table();
		tblValores.setImmediate(false);
		tblValores.setWidth("500px");
		tblValores.setHeight("210px");
		pnlValores.addComponent(tblValores);
		
		return pnlValores;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlFiltroValores() {
		// common part: create layout
		pnlFiltroValores = new HorizontalLayout();
		pnlFiltroValores.setImmediate(false);
		pnlFiltroValores.setWidth("-1px");
		pnlFiltroValores.setHeight("-1px");
		pnlFiltroValores.setMargin(false);
		
		// txtFiltroCodigoValor
		txtFiltroCodigoValor = new TextField();
		txtFiltroCodigoValor.setImmediate(false);
		txtFiltroCodigoValor.setWidth("160px");
		txtFiltroCodigoValor.setHeight("-1px");
		txtFiltroCodigoValor.setInputPrompt("Código");
		pnlFiltroValores.addComponent(txtFiltroCodigoValor);
		
		// txtFiltroNombreValor
		txtFiltroNombreValor = new TextField();
		txtFiltroNombreValor.setImmediate(false);
		txtFiltroNombreValor.setWidth("230px");
		txtFiltroNombreValor.setHeight("-1px");
		txtFiltroNombreValor.setInputPrompt("Nombre");
		pnlFiltroValores.addComponent(txtFiltroNombreValor);
		
		// txtFiltroEstadoValor
		txtFiltroEstadoValor = new TextField();
		txtFiltroEstadoValor.setImmediate(false);
		txtFiltroEstadoValor.setWidth("70px");
		txtFiltroEstadoValor.setHeight("-1px");
		txtFiltroEstadoValor.setInputPrompt("Estado");
		pnlFiltroValores.addComponent(txtFiltroEstadoValor);
		
		return pnlFiltroValores;
	}

	@AutoGenerated
	private VerticalLayout buildPnlGrabarValor() {
		// common part: create layout
		pnlGrabarValor = new VerticalLayout();
		pnlGrabarValor.setImmediate(false);
		pnlGrabarValor.setWidth("-1px");
		pnlGrabarValor.setHeight("-1px");
		pnlGrabarValor.setMargin(false);
		
		// lblGrabarValor
		lblGrabarValor = new Label();
		lblGrabarValor.setStyleName("h2");
		lblGrabarValor.setImmediate(false);
		lblGrabarValor.setWidth("100.0%");
		lblGrabarValor.setHeight("-1px");
		lblGrabarValor.setValue("Administración de Valor");
		pnlGrabarValor.addComponent(lblGrabarValor);
		
		// pnlValorFila1
		pnlValorFila1 = buildPnlValorFila1();
		pnlGrabarValor.addComponent(pnlValorFila1);
		
		// pnlValorFila2
		pnlValorFila2 = buildPnlValorFila2();
		pnlGrabarValor.addComponent(pnlValorFila2);
		
		// pnlValorFila3
		pnlValorFila3 = buildPnlValorFila3();
		pnlGrabarValor.addComponent(pnlValorFila3);
		
		// pnlValorFila4
		pnlValorFila4 = buildPnlValorFila4();
		pnlGrabarValor.addComponent(pnlValorFila4);
		
		// pnlValorFila5
		pnlValorFila5 = buildPnlValorFila5();
		pnlGrabarValor.addComponent(pnlValorFila5);
		
		return pnlGrabarValor;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlValorFila1() {
		// common part: create layout
		pnlValorFila1 = new HorizontalLayout();
		pnlValorFila1.setImmediate(false);
		pnlValorFila1.setWidth("-1px");
		pnlValorFila1.setHeight("-1px");
		pnlValorFila1.setMargin(false);
		
		// cmbLista
		cmbLista = new ComboBox();
		cmbLista.setImmediate(false);
		cmbLista.setWidth("315px");
		cmbLista.setHeight("-1px");
		pnlValorFila1.addComponent(cmbLista);
		
		return pnlValorFila1;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlValorFila2() {
		// common part: create layout
		pnlValorFila2 = new HorizontalLayout();
		pnlValorFila2.setCaption(" ");
		pnlValorFila2.setImmediate(false);
		pnlValorFila2.setWidth("-1px");
		pnlValorFila2.setHeight("-1px");
		pnlValorFila2.setMargin(false);
		pnlValorFila2.setSpacing(true);
		
		// lblIdValor
		lblIdValor = new Label();
		lblIdValor.setImmediate(false);
		lblIdValor.setWidth("40px");
		lblIdValor.setHeight("-1px");
		lblIdValor.setValue("Label");
		pnlValorFila2.addComponent(lblIdValor);
		pnlValorFila2.setComponentAlignment(lblIdValor, new Alignment(9));
		
		// txtCodigoValor
		txtCodigoValor = new TextField();
		txtCodigoValor.setCaption("Código");
		txtCodigoValor.setImmediate(false);
		txtCodigoValor.setWidth("120px");
		txtCodigoValor.setHeight("-1px");
		txtCodigoValor.setRequired(true);
		txtCodigoValor.setInputPrompt("Código");
		pnlValorFila2.addComponent(txtCodigoValor);
		
		// cboEstadoValor
		cboEstadoValor = new ComboBox();
		cboEstadoValor.setCaption("Estado");
		cboEstadoValor.setImmediate(false);
		cboEstadoValor.setWidth("145px");
		cboEstadoValor.setHeight("-1px");
		cboEstadoValor.setRequired(true);
		pnlValorFila2.addComponent(cboEstadoValor);
		
		return pnlValorFila2;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlValorFila3() {
		// common part: create layout
		pnlValorFila3 = new HorizontalLayout();
		pnlValorFila3.setCaption(" ");
		pnlValorFila3.setImmediate(false);
		pnlValorFila3.setWidth("-1px");
		pnlValorFila3.setHeight("-1px");
		pnlValorFila3.setMargin(false);
		pnlValorFila3.setSpacing(true);
		
		// txtNombreValor
		txtNombreValor = new TextField();
		txtNombreValor.setCaption("Nombre");
		txtNombreValor.setImmediate(false);
		txtNombreValor.setWidth("180px");
		txtNombreValor.setHeight("-1px");
		txtNombreValor.setRequired(true);
		txtNombreValor.setInputPrompt("Nombre de valor segun la Lista");
		pnlValorFila3.addComponent(txtNombreValor);
		pnlValorFila3.setExpandRatio(txtNombreValor, 1.0f);
		
		// txtOrdenValor
		txtOrdenValor = new TextField();
		txtOrdenValor.setCaption("Orden");
		txtOrdenValor.setImmediate(false);
		txtOrdenValor.setWidth("130px");
		txtOrdenValor.setHeight("-1px");
		txtOrdenValor.setRequired(true);
		txtOrdenValor.setInputPrompt("Orden de presentación");
		pnlValorFila3.addComponent(txtOrdenValor);
		
		return pnlValorFila3;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlValorFila4() {
		// common part: create layout
		pnlValorFila4 = new HorizontalLayout();
		pnlValorFila4.setCaption(" ");
		pnlValorFila4.setImmediate(false);
		pnlValorFila4.setWidth("-1px");
		pnlValorFila4.setHeight("-1px");
		pnlValorFila4.setMargin(false);
		
		// txtDescripcionValor
		txtDescripcionValor = new TextField();
		txtDescripcionValor.setCaption("Descripción");
		txtDescripcionValor.setImmediate(false);
		txtDescripcionValor.setWidth("315px");
		txtDescripcionValor.setHeight("-1px");
		txtDescripcionValor.setRequired(true);
		txtDescripcionValor.setInputPrompt("Descripción breve del parametro");
		pnlValorFila4.addComponent(txtDescripcionValor);
		pnlValorFila4.setExpandRatio(txtDescripcionValor, 1.0f);
		
		return pnlValorFila4;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlValorFila5() {
		// common part: create layout
		pnlValorFila5 = new HorizontalLayout();
		pnlValorFila5.setCaption(" ");
		pnlValorFila5.setImmediate(false);
		pnlValorFila5.setWidth("320px");
		pnlValorFila5.setHeight("-1px");
		pnlValorFila5.setMargin(false);
		
		// btnGrabarValor
		btnGrabarValor = new Button();
		btnGrabarValor.setCaption("Actualizar");
		btnGrabarValor.setImmediate(true);
		btnGrabarValor.setWidth("-1px");
		btnGrabarValor.setHeight("-1px");
		pnlValorFila5.addComponent(btnGrabarValor);
		pnlValorFila5.setComponentAlignment(btnGrabarValor, new Alignment(20));
		
		// btnEliminarValor
		btnEliminarValor = new Button();
		btnEliminarValor.setCaption("Eliminar");
		btnEliminarValor.setImmediate(true);
		btnEliminarValor.setWidth("-1px");
		btnEliminarValor.setHeight("-1px");
		pnlValorFila5.addComponent(btnEliminarValor);
		pnlValorFila5
				.setComponentAlignment(btnEliminarValor, new Alignment(20));
		
		return pnlValorFila5;
	}
}
